#include <head.h>
/**
 * @函数原型: int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
 * @函数功能: 用于检查或更改指定信号的处理方式。相比 `signal` 函数，`sigaction` 提供了更强大的功能和更精细的控制。
 * @参数说明:
 * @       参数1: signum: 要处理的信号编号，如 SIGINT, SIGTERM 等。
 * @       参数2: act: 指向一个 `struct sigaction` 结构的指针，用于指定新的信号处理行为。如果为 NULL，则表示不修改当前行为。
 * @       参数3: oldact: 如果不为 NULL，用于存储先前的信号处理行为。
 * @返回值:
 *          成功: 返回 0。
            失败: 返回 -1，并设置相应的错误码。
 */

void sig_handler(int signum, siginfo_t *info, void *ucontext)
{
    printf("捕获到信号 %d\n", signum);
    struct passwd *pw = getpwuid(info->si_uid);
    printf("信号发送者用户名: %s\n", pw->pw_name);
    printf("信号发送者进程ID: %d\n", info->si_pid);
    exit(0);
}

int main(int argc, char const *argv[])
{
    struct sigaction act; // 定义一个 sigaction 结构体变量

    memset(&act, 0, sizeof(act));

    act.sa_sigaction = sig_handler; // 指定信号处理函数
    act.sa_flags = SA_SIGINFO;      // 使用 siginfo_t 结构体传递额外信息

    sigaction(SIGINT, &act, NULL);

    while (1)
    {
        sleep(1);
    }

    return 0;
}
